/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tpdisenio2009.mvp.presenter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import tpdisenio2009.model.beans.TournamentDate;
import tpdisenio2009.mvp.display.ManageBanPeriodsView;
import tpdisenio2009.services.TournamentDateService;

/**
 *
 * @author Pablito
 */
public class ManageBanPeriodsPresenter extends DefaultPresenter<ManageBanPeriodsView> {

    private final TournamentDateService tournamentDateService;

    private ActionListener saveListener;

    public ManageBanPeriodsPresenter( ManageBanPeriodsView view ) {
        super( view );

        tournamentDateService = new TournamentDateService();
        getView().loadTournamentDates( tournamentDateService.getDates() );

        bind();
    }

    public void bind() {
        saveListener = new ActionListener() {            
            public void actionPerformed(ActionEvent e) {                                
                if( showConfirmation( "¿Confirma que desea guardar los cambios?" ) ) {
                    saveTournamentDate();
                    getView().loadTournamentDates( tournamentDateService.getDates() );
                }
            }
        };
        getView().addSaveListener( saveListener );
    }

    public void unbind() {
        if (saveListener != null)
            getView().removeSaveListener( saveListener );
    }

    private void saveTournamentDate( ) {
        
        TournamentDate updatedDate = getView().getCurrentEditDate();
        int row = ( updatedDate.getId() - 1 );

        if ( updatedDate.getInitialDate() != null ) {
            if ( updatedDate.getBanDate() != null ) {
                if ( validateSameDates( updatedDate ) ) {
                    if ( validateSystemDate( updatedDate ) ) {
                        if ( row > 0 ) {
                            if ( validatePreviousDate ( updatedDate, getView().getTournamentDate(row-1) ) ) {
                                if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                                        tournamentDateService.update( updatedDate );
                                        getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                                }
                            } else {
                                getView().showError( row,
                                    "<html>La fecha y hora de inicio en la <strong>Fecha " + (row + 1) + "</strong> debe ser mayor o igual a la fecha<br>y hora de finalización del último período de veda de la <strong>Fecha " + (row) + "</strong>.</html>",
                                    "Error:Fecha y hora inválida" );
                                getView().cleanCell(row, 1);
                                getView().cleanCell(row, 2);
                            }
                        } else {
                            if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                                tournamentDateService.update( updatedDate );
                                getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                            }
                        }
                    } else {
                        getView().showError( row,
                            "<html>La fecha y hora de inicio en la <strong>Fecha " + (row + 1) + "</strong> debe ser mayor o igual<br>a la fecha y hora actual.</html>",
                            "Error:Fecha y hora inválida" );
                        getView().cleanCell(row, 1);
                        getView().cleanCell(row, 2);
                    }                    
                } else {
                    getView().showError( row,
                        "<html>La fecha y hora de inicio es mayor o igual a la fecha<br>y hora de finalización del período en la <strong>Fecha " + (row + 1) + "</strong>.</html>",
                        "Error:Período inválido" );
                        getView().cleanCell(row, 3);
                        getView().cleanCell(row, 4);
                }
            } else {
                if ( validateSystemDate( updatedDate ) ) {
                    if ( row > 0 ) {
                        if ( validatePreviousDate ( updatedDate, getView().getTournamentDate(row-1) ) ) {
                            if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                                tournamentDateService.update( updatedDate );
                               getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                            }
                        } else {
                            getView().showError( row,
                                "<html>La fecha y hora de inicio en la <strong>Fecha " + (row + 1) + "</strong> debe ser mayor o igual a la fecha<br>y hora de finalización del último período de veda de la <strong>Fecha " + (row) + "</strong>.</html>",
                                "Error:Fecha y hora inválida" );
                            getView().cleanCell(row, 1);
                            getView().cleanCell(row, 2);
                        }
                    } else {
                        if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                            tournamentDateService.update( updatedDate );
                            getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                        }
                    }
                } else {
                    getView().showError( row,
                        "<html>La fecha y hora de inicio en la <strong>Fecha " + (row + 1) + "</strong> debe ser mayor o igual<br>a la fecha y hora actual.</html>",
                        "Error:Fecha y hora inválida" );
                    getView().cleanCell(row, 1);
                    getView().cleanCell(row, 2);
                }
            }
        } else {
            tournamentDateService.update( updatedDate );
            getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
        }
    }

    /*
    private void saveTournamentDate( ) {

        TournamentDate updatedDate = getView().getCurrentEditDate();
        int row = ( updatedDate.getId() - 1 );

        if ( updatedDate.getBanDate() != null ) {
            if ( validateSameDates( updatedDate ) ) {
                if ( row > 0 ) {
                    if ( validatePreviousDate ( updatedDate, getView().getTournamentDate(row-1) ) ) {
                        if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                                tournamentDateService.update( updatedDate );
                                getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                        }
                    } else {
                        getView().showError( row,
                            "<html>La fecha y hora de inicio en la <strong>Fecha " + (row + 1) + "</strong> debe ser mayor o igual a la fecha<br>y hora de finalización del último período de veda de la <strong>Fecha " + (row) + "</strong>.</html>",
                            "Error:Fecha y hora inválida" );
                    }
                } else {
                    if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                        tournamentDateService.update( updatedDate );
                        getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                    }
                }
            } else {
                getView().showError( row,
                    "<html>La fecha y hora de inicio es mayor a la fecha<br>y hora de finalización del período en la <strong>Fecha " + (row + 1) + "</strong>.</html>",
                    "Error:Período inválido" );
                    getView().cleanCell(row, 3);
                    getView().cleanCell(row, 4);
            }
        } else {
            if ( row > 0 ) {
                if ( validatePreviousDate ( updatedDate, getView().getTournamentDate(row-1) ) ) {
                    if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                        tournamentDateService.update( updatedDate );
                        getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                    }
                } else {
                    getView().showError( row,
                        "<html>La fecha y hora de inicio en la <strong>Fecha " + (row + 1) + "</strong> debe ser mayor o igual a la fecha<br>y hora de finalización del último período de veda de la <strong>Fecha " + (row) + "</strong>.</html>",
                        "Error:Fecha y hora inválida" );
                }
            } else {
                if ( updatedDate.getState().equals( TournamentDate.OPEN_DATE ) ) {
                    tournamentDateService.update( updatedDate );
                    getView().showNotification( "<html>¡Felicitaciones! Los registros han sido<br>guardados satisfactoriamente.</html>", "Edición exitosa" );
                }
            }
        }
    } */
    
    private boolean validateSameDates( TournamentDate updatedDate ) {
        if ( updatedDate.getInitialDate().after( updatedDate.getBanDate() ) || (updatedDate.getInitialDate().equals(updatedDate.getBanDate())) ) {
            return false;
        } else {
            return true;
        }
    }

    private boolean validatePreviousDate ( TournamentDate initialCurrent, TournamentDate banPrevious ) {
        if ( ( banPrevious.getBanDate() != null ) && ( banPrevious.getBanDate().after(initialCurrent.getInitialDate()) ) ) {            
            return false;
        } else {
            return true;
        }
    }

    private boolean validatePostDate ( TournamentDate banCurrent, TournamentDate initialPost ) {
        if ( ( initialPost.getBanDate() != null ) && ( initialPost.getBanDate().after(banCurrent.getInitialDate()) ) ) {
            return false;
        } else {
            return true;
        }
    }
    
    private boolean validateSystemDate ( TournamentDate initial ) {
        //El constructor genera un Date con la fecha y hora actuales.
        Date systemDate = new Date();
        if ( initial.getInitialDate().before( systemDate ) ) {
            return false;
        } else {
            return true;
        }
    }

    private boolean showConfirmation(String message) {
        return getView().showConfirmation( message );
    }
}
